/* Universidad del Valle de Guatemala
 * Seccion 30, Algoritmos y Estructura de Datos
 * Mariana Castillo, 12319
 * Julio Maldonado, 12377
 * Se utiliza el algoritmos de Floyd para obtener el camino mas corto en un grafo de ciudades
 */
package hoja9;

import java.util.Scanner;
import java.io.*;
import java.util.*;

public class Hoja9 {

   
    public static void main(String[] args) {
        // TODO code application logic here
        String op, op1; //Opciones de menu
        int z=0; //Control de menu
        Floyd matriz= new Floyd();//Matriz de Adyacencia
        Scanner scan= new Scanner(System.in); //Ingreso con el teclado
        
        //SE muestra la ruta donde debe estar el archivo texto.txt
        System.out.println("Ruta de archivo texto.txt: ");
        String dir = ((System.getProperty("user.dir"))+"\\texto.txt");
        System.out.print(dir.replace("\\", "/")+"\n");
        
        //Menu del programa
        while(z==0){
            matriz.graf.show();
            System.out.println("\nMENU");
            System.out.println("1. Ruta Mas Corta");
            System.out.println("2. Centro del Grafo");
            System.out.println("3. Modificar Grafo");
            System.out.println("4. Fin");
            op= scan.nextLine();
            if(op.equals("1")){
                matriz.caminoCorto();
                System.out.println("\nCiudad de origen:");
                String ciudad1=scan.nextLine();
                System.out.println("Ciudad destino:");
                String ciudad2=scan.nextLine();
                                
                if(matriz.graf.containsVertice(ciudad1)&&matriz.graf.containsVertice(ciudad2)){
                    System.out.println("\nLa Distancia Minima es: "+matriz.graf.getEdge(ciudad1,ciudad2)+" ");
                    if(matriz.graf.getEdge(ciudad1,ciudad2)!=20000){
                        System.out.print("La Ruta es: "+ciudad1);
                        matriz.mostrarIntermedias(matriz.graf.getIndex(ciudad1), matriz.graf.getIndex(ciudad2));
                        System.out.println(", "+ciudad2);
                    }
                }else{
                    System.out.println("Error en el ingreso de Ciudades");
                }
                
            }
            //Se calcula el centro del Grafo
            else if(op.equals("2")){
                matriz.centroGrafo();
                
            }
            //Modificar el grafo
            else if(op.equals("3")){
                System.out.println("\n1. Hay interrupcion de trafico entre un par de ciudades");
                System.out.println("2. Establecer nueva conexion");
                op1 = scan.nextLine();
                // Si la respuesta es 1, preguntar por el nombre de las ciudades y colocar un numero muy grande
                // en la matriz de adyacencia para indicar que no hay conexion
                if(op1.equals("1")){
                    System.out.println("\nCiudad de Origen:");
                    String ciudad1 = scan.nextLine();
                    System.out.println("Ciudad de Destino");
                    String ciudad2 = scan.nextLine();
                    if((matriz.graf.containsVertice(ciudad1))&&(matriz.graf.containsVertice(ciudad2))){
                        matriz.graf.addEdge(ciudad1, ciudad2, 20000);
                        // Guarda los cambios en el archivo
                        try {
                            matriz.a.writeB(ciudad1+" "+ciudad2+" 20000");
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    }
                    else{
                        System.out.println("\nNo existen esas ciudades\n");
                    }
                }
                // Si la respuesta es 2, preguntar por el nombre de las ciudades y agregar nueva distancia.
                else if(op1.equals("2")){
                    System.out.println("\nCiudad de Origen: ");
                    String ciudad1 = scan.next();
                    System.out.println("Ciudad de Destino: ");
                    String ciudad2 = scan.next();
                    System.out.println("\nDistancia entre las ciudades: ");
                    int distancia = scan.nextInt();
                    // Si las ciudades ya existen, cambiar el valor
                    if(matriz.graf.containsVertice(ciudad1)&&matriz.graf.containsVertice(ciudad2)){
                        matriz.graf.addEdge(ciudad1, ciudad2, distancia);
                    }
                    // Si las ciudades no existen, agregarlas a la matriz
                    else{
                        matriz.graf.addVertice(ciudad1);
                        matriz.graf.addVertice(ciudad2);
                        matriz.graf.addEdge(ciudad1, ciudad2, distancia);
                    }
                    // Guarda los cambios en el archivo
                    try {                       
                        matriz.a.writeB(ciudad1+" "+ciudad2+" "+distancia);

                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
                
            }
            else if(op.equals("4")){
                z=1;
                System.out.println("FIN DEL PROGRAMA");
            }
            else{
                 //Si se ingrese algo diferente de los # de 1-4 entonces se muestra un mensaje de error
                 System.out.println("\nOPCION INVALIDA\n");
            }
        }
    }
}
